package com.erlang.jpa.pojo;

import com.erlang.jpa.util.JPAUtil;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List;

/**
 * 测试 JPQL
 *
 * @Author ZGQ
 */
public class CustomerTestJPQL {

  //查询所有客户
  @Test
  public void findAll() {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
      //获取实体管理对象
      em = JPAUtil.getEntityManager();
      //获取事务对象
      tx = em.getTransaction();
      tx.begin();
      // 创建query对象
      String jpql = "from Customer";
      Query query = em.createQuery(jpql);
      // 查询并得到返回结果
      List list = query.getResultList(); // 得到集合返回类型
      for (Object object : list) {
        System.out.println(object);
      }
      tx.commit();
    } catch (Exception e) {
      // 回滚事务
      tx.rollback();
      e.printStackTrace();
    } finally {
      // 释放资源
      em.close();
    }
  }

  //分页查询客户
  @Test
  public void findPaged () {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
      //获取实体管理对象
      em = JPAUtil.getEntityManager();
      //获取事务对象
      tx = em.getTransaction();
      tx.begin();

      //创建query对象
      String jpql = "from Customer";
      Query query = em.createQuery(jpql);
      //起始索引
      query.setFirstResult(0);
      //每页显示条数
      query.setMaxResults(2);
      //查询并得到返回结果
      List list = query.getResultList(); //得到集合返回类型
      for (Object object : list) {
        System.out.println(object);
      }
      tx.commit();
    } catch (Exception e) {
      // 回滚事务
      tx.rollback();
      e.printStackTrace();
    } finally {
      // 释放资源
      em.close();
    }
  }

  //条件查询
  @Test
  public void findCondition () {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
      //获取实体管理对象
      em = JPAUtil.getEntityManager();
      //获取事务对象
      tx = em.getTransaction();
      tx.begin();
      //创建query对象
      String jpql = "from Customer where custName like ? ";
      Query query = em.createQuery(jpql);
      //对占位符赋值，从1开始
      query.setParameter(1, "阿枫%");
      //查询并得到返回结果
      Object object = query.getSingleResult(); //得到唯一的结果集对象
      System.out.println(object);
      tx.commit();
    } catch (Exception e) {
      // 回滚事务
      tx.rollback();
      e.printStackTrace();
    } finally {
      // 释放资源
      em.close();
    }
  }

  //根据客户id倒序查询所有客户
  //查询所有客户
  @Test
  public void testOrder() {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
      //获取实体管理对象
      em = JPAUtil.getEntityManager();
      //获取事务对象
      tx = em.getTransaction();
      tx.begin();
      // 创建query对象
      String jpql = "from Customer order by custId desc";
      Query query = em.createQuery(jpql);
      // 查询并得到返回结果
      List list = query.getResultList(); // 得到集合返回类型
      for (Object object : list) {
        System.out.println(object);
      }
      tx.commit();
    } catch (Exception e) {
      // 回滚事务
      tx.rollback();
      e.printStackTrace();
    } finally {
      // 释放资源
      em.close();
    }
  }

  //统计查询
  @Test
  public void findCount() {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
      //获取实体管理对象
      em = JPAUtil.getEntityManager();
      //获取事务对象
      tx = em.getTransaction();
      tx.begin();
      // 查询全部客户
      // 1.创建query对象
      String jpql = "select count(custId) from Customer";
      Query query = em.createQuery(jpql);
      // 2.查询并得到返回结果
      Object count = query.getSingleResult(); // 得到集合返回类型
      System.out.println(count);
      tx.commit();
    } catch (Exception e) {
      // 回滚事务
      tx.rollback();
      e.printStackTrace();
    } finally {
      // 释放资源
      em.close();
    }
  }
}